Yamahaルーターで複数のトンネルインターフェースを設定しIPSec接続を行ってみました
初めに
元々ネットワークエンジニアの出ではないということもありBGPとかのあたりって実は机上での理解で実際にルーターで設定書いたことなかったのでVPCと自宅で拠点間VPNで貼ってみてそこで試そうと思っていたのですがその前段のIPSec周りの設定でつまづいていました。
単にサンプルコンフィグを持っていくだけでも良かったのですが、L2TP/IPSecの設定がすでに存在している関係でそこを回避する必要があったのと、しっかりやろうとすると意外と各要素の結び付きが理解できていないなーと思ったのでその辺りの備忘録となります。
結局作業中にL2TP/IPSec側の設定を上書きした状態で保存し設定を破壊するということを何度か発生させ必死に修正する羽目になりました(以前取ったバックアップが行方不明になっており事前共通鍵を消失させたのが痛かったです)。
環境
今回ルーターはRTX 830を利用しています。
> show environment
RTX830 BootROM Ver. 1.00
RTX830 FlashROM Table Ver. 1.00
RTX830 Rev.15.02.28 (Wed Dec 28 19:47:51 2022)
※ しばらくバージョン上げてないのでそろそろ上げないといけないですね...。
設定前にはL2TP/IPSec用にインターネット(any)から受け付けるトンネルのみが存在し、今回はAWSのVPCと拠点間VPN(site-to-site VPN)によるIPSec接続を行う形となります。
本記事の趣旨としてAWS側のVPN設定が大きく影響する部分はないため詳細な設定は割愛しますがCloudFormationでほぼデフォルトお任せ設定で生成されている形になります。
Vpn:
Type: AWS::EC2::VPNConnection
Properties:
CustomerGatewayId: !Ref CgwId
Type: ipsec.1
VpnGatewayId: !Ref Vgw
Vgw:
Type: AWS::EC2::VPNGateway
Properties:
AmazonSideAsn: !Ref VgwAsn
Type: ipsec.1
VgwAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref Vpc
VpnGatewayId: !Ref Vgw
最終的な設定
最終的な設定は以下のようになりました。
トンネル1はインターネット(any)からの接続のためのL2TP/IPSec用トンネルインターフェース、
トンネル11は今回新規で構築したVPCとの拠点間VPN(IPSec)用トンネルインターフェースとなります。
# show config tunnel 1
tunnel select 1
tunnel encapsulation l2tp
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike version 1 2
ipsec ike keepalive use 1 off
ipsec ike local address 1 {{router local ip}}
ipsec ike nat-traversal 1 on
ipsec ike pre-shared-key 1 text xxxxxxx
ipsec ike remote address 1 any
l2tp tunnel disconnect time off
l2tp syslog on
ip tunnel tcp mss limit auto
tunnel enable 1
# show config tunnel 11
tunnel select 11
ipsec ike version 11 2
ipsec ike duration isakmp-sa 11 28800
ipsec ike encryption 11 aes-cbc
ipsec ike group 11 modp1024
ipsec ike hash 11 sha
ipsec ike pre-shared-key 11 text xxxxxxx
ipsec ike duration ipsec-sa 11 3600
ipsec ike pfs 11 on
ipsec ike message-id-control 11 on
ipsec ike child-exchange type 11 2
ipsec ike keepalive use 11 on rfc4306 10 3
ipsec ike remote name 11 aws-vpc-1
ipsec ike remote address 11 {{AWS GIP}}
ipsec ike remote name 11 {{AWS GIP}} ipv4-addr
ipsec ike negotiation receive 11 off
ipsec tunnel outer df-bit clear
ip tunnel address {{tunnel IP}}/255.255.255.252
ip tunnel remote address {{Peer IP}}
ip tunnel tcp mss limit auto
ポイントとなった要素
自分は以下の3つの要素の関連性の理解がポイントとなりました。
- トンネルインターフェース番号(tunnel_num)
- SAポリシーID(policy_id)
- セキュリティゲートウェイID(gateway_id)
各要素の結びつきは以下のような形です(個人のイメージです)。
トンネルインターフェース
https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/guide.html
IPsecでは、暗号化されたIPパケットがインターネットを経由して送受信されますが、 このように暗号によって実現される安全な通信経路をトンネルとよびます。 現実のトンネルが硬いコンクリートで覆われるように、 VPNのトンネルも強固な暗号によって守られているので、 トンネルは仮想的な専用回線とみなすことができます。RTシリーズでは、トンネルを「仮想的な専用回線」とみなし、 この回線に相当するインタフェースをトンネルインタフェース とよんでいます。RTシリーズには、 LANインタフェースやPPインタフェースというインタフェースがありますが、 トンネルインタフェースも、これらと同様に扱うことができます。
これは各IPSecの受け口となる仮想的なインターフェースとなります。
各種設定は最終的になんらかのインターフェースに結びつきますが当然1回線(1PP)=1IPSec接続というわけにもいかないのでそれ用に論理的なインターフェースを用意する形となります(というのが自分の理解です)。
このトンネルインターフェースに対して各種IPSec周りの設定を与えることでIPSecによる通信ができるようになります。
それぞれのインターフェースは利用できるようになっているため作成自体のコマンドは不要ですがデフォルトでは無効化されているためtunnel enableを実行することで有効化することができます。
tunnel enable 11
SAポリシー
IPSecが概要レベルの理解となっているためふわっとしているところもあるのですがSA(Security Architecture)自体はIPSecにおけるコネクション部分となるようです。
https://www.rtpro.yamaha.co.jp/RT/manual/nvr500/ipsec/ipsec_chapter.html
鍵や鍵の寿命、暗号や認証のアルゴリズムなどを登録した管理情報は、SA(Security Association) で管理します。SA を区別する ID は自動的に付与されます。SA の ID や状態はshow ipsec sa コマンドで確認することができます。SA には、鍵の寿命に合わせた寿命があります。SA の属性のうちユーザが指定可能なパラメータをポリシーと呼びます。
定義上ではAn SA is a simplex "connection"
と表現されているもののIPSec自体はパケットの暗号化や認証などの機能を持つためこれらの設定もSAで持つようです。
このポリシーの作成はipsec sa policyにより行い、POLICY_ID、GATEWAY_IDには識別できる任意の値を入力します。
この段階ではポリシーとトンネルインターフェースは結びついていないためipsec tunnelコマンドを利用することで結びつけます。このコマンドで指定したSAポリシーが結びつくトンネルIFは
tunnel select設定対象としているトンネルIFとなります。
## トンネルIF 11を操作対象とする
tunnel select 11
## policy_id=1101のSAポリシーを生成する
## esp aes-cbc sha-hmacを利用、gateway_id=11に設定される設定群を利用する(後述)
ipsec sa policy 1101 11 esp aes-cbc sha-hmac
## トンネルIF 11にpolicy_id=11のSAポリシーを結びつける
ipsec tunnel 1101
セキュリティゲートウェイ
https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/index.html
VPNの構成では、端末が通信を暗号化する必要がないので、 暗号化のためのソフトウェアを用意する必要はありません。 一方、ルータは、LANからWANへ向かう通信に暗号をかけ、 WANから受信した通信の暗号を解くという機能を持ちます。 IPsecでは、このような機能を持つルータのことを セキュリティ・ゲートウェイ(Security Gateway)とよんでいます。 RTシリーズのルータも同様にセキュリティ・ゲートウェイとして動作します。
IPSec機能を持つデバイスのことをセキュリティゲートウェイと呼ぶようです。
前述のSAがコネクションになるわけですが、その前段である鍵交換(IKE)の情報や各種終端(ゲートウェイ)の情報はSA自体には直接持たないため別途セキュリティ・ゲートウェイとしての設定で持っていると個人的には理解しています。
セキュリティゲートウェイに関しては単一のコマンドで生成するものではなくgateway_id
を指定する各種コマンドを実行することで生成される仮想的な集合となりそうです。
ipsec ike version 11 2
ipsec ike duration ipsec-sa 11 3600
ipsec ike duration isakmp-sa 11 28800
...
SAポリシーとの紐付けは前述のipsec sa policy`の実行時に指定したgateway_idで結びつく形となります。
policy_idとgateway_idはトンネルごとの採番ではない
show config tunnel
で各トンネルの設定を見ると以下のようにインデントが入りそれぞれの小要素となっている設定にみえそうですが実際にはSAポリシー及びそれに結びつくセキュリティゲートウェイのID及びそれに結びつく設定はトンネルごとに管理されているものではなくグローバルな空間で共通となっております。
# show config tunnel 1
tunnel select 1
tunnel encapsulation l2tp
ipsec tunnel 1101
ipsec sa policy 1101 11 esp aes-cbc sha-hmac
そのため先の記載を済ませた状態でトンネル1でipsec tunnel 1101
を実行しトンネルID11に結びつけられているSAポリシーを割り当てるとトンネル1の側でもトンネル11側に割り当てられているSAポリシーやセキュリティゲートウェイの設定が確認できるようになります。
# show config tunnel 1
tunnel select 1
tunnel encapsulation l2tp
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike keepalive use 1 off
ipsec ike local address 1 192.168.10.xxx
ipsec ike nat-traversal 1 on
ipsec ike pre-shared-key 1 text ***
ipsec ike remote address 1 any
l2tp tunnel disconnect time off
l2tp syslog on
ip tunnel tcp mss limit auto
tunnel enable 1
### tunnel_num=1にtunnel_num=11に割り当てられているpolicy_id=1101を設定すると同等のものが設定される
# tunnel select 1
tunnel1# ipsec tunnel 1101
tunnel1# show config tunnel 1
tunnel select 1
tunnel encapsulation l2tp
ipsec tunnel 1101
ipsec sa policy 1101 11 esp aes-cbc sha-hmac
ipsec ike version 11 2
ipsec ike duration ipsec-sa 11 3600
ipsec ike duration isakmp-sa 11 28800
...
トンネル毎の設定だと思って誤って上書きしないようにしましょう。
動作確認
設定については最初に記載した通りものとなりますがVPCとのIPSecとの接続を行っている状態で別途L2TP/IPSecを行い接続が確認できたことによりそれぞれのトンネルが独立した設定で動いていることを確認することができます。
# show ipsec sa gateway
sgw flags local-id remote-id # of sa
---------------------------------------------------------------------------
11 U K 192.168.10.x x.x.x.x.x i:1 s:1 r:1
1 U 192.168.10.x y.y.y.y i:1 s:1 r:1
# show status tunnel 1
TUNNEL[1]:
説明:
インタフェースの種類: L2TP
トンネルインタフェースはL2TPで利用されています
L2TPの状態はshow status ppコマンドとshow status l2tpコマンドで表示できます
# show status tunnel 11
TUNNEL[11]:
説明:
インタフェースの種類: IPsec
トンネルインタフェースは接続されています
開始: 2024/09/26 02:29:05
通信時間: 41秒
受信: (IPv4) 1524 パケット [104630 オクテット]
(IPv6) 0 パケット [0 オクテット]
送信: (IPv4) 2649 パケット [163190 オクテット]
(IPv6) 0 パケット [0 オクテット]
IKEキープアライブ:
[タイプ]: rfc4306
[状態]: 送信
[次の送信]: 10 秒後
AWS側からもIPSEC IS UP
が表示されているので正常に接続できていることが確認できています。
※ Tunnel2は意図的に未接続、ステータスのダウンはBGPの設定をしていないため。
終わりに
家で簡単に触ってる分にはトンネルインターフェースをいくつも準備してということもないのでいい機会になりました。やはり設定を破壊した時ほど覚えが早い時はないのでこういう時に自宅に触れる機器があってよかったというところではあります。
Yamahaルーターとしての設定は理解したもののそもそもSAってなんだ?等々調べているとIPSec実は何も知らないというのを実感してしまうのでこれはこれでなんとかして行かなければというところではあります。